home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / e / 2b_CrtvE_src.lha / cache.s < prev    next >
Text File  |  2001-01-29  |  4KB  |  190 lines

  1. ;; Cache Handler
  2. PORTCOOKIE  = $DEADBEEF
  3.  
  4. CACHENAME:    DC.B    "EmoduleCache",0,0
  5. PORTADR:      DC.L    0   ; MUST BE NIL FOR NO_CACHE
  6. CACHENAMESTART:   DC.L    0
  7. CACHENAMEEND: DC.L    0
  8.  
  9. FLUSHMODULE:          ; D0=MODPTR
  10.     MOVEM.L D1/D2/D3/A0-A3/A6,-(A7)
  11.     MOVE.L  D0,D1           ; D1=MODNAME
  12.     MOVE.L  D1,A0
  13. .SL:    MOVE.B  (A0)+,D2        ; CHOMP OFF PATH
  14.     CMP.B   #":",D2
  15.     BEQ.S   .SP
  16.     CMP.B   #"/",D2
  17.     BEQ.S   .SP
  18.     TST.B   D2
  19.     BNE.S   .SL
  20.     MOVE.L  PORTADR(PC),D0
  21.     BEQ.S   .X
  22.     MOVE.L  D0,A0
  23.     LEA 38(A0),A0       ; A1=PREV, A0=CUR
  24. .XL:MOVE.L  A0,A1
  25.     MOVE.L  (A0),A0
  26.     MOVE.L  A0,D0
  27.     BEQ.S   .X
  28.     MOVE.L  8(A0),D2
  29.     MOVE.L  D2,A2
  30. .SL2:   MOVE.B  (A2)+,D3        ; CHOMP OFF PATH HERE TOO
  31.     CMP.B   #":",D3
  32.     BEQ.S   .SP2
  33.     CMP.B   #"/",D3
  34.     BEQ.S   .SP2
  35.     TST.B   D3
  36.     BNE.S   .SL2
  37.     MOVE.L  D2,A2
  38.     MOVE.L  D1,A3
  39. .CL:    CMPM.B  (A2)+,(A3)+     ; SPECIAL STRCMP: ENDS MUST MATCH
  40.     BNE.S   .XL
  41.     TST.B   -1(A2)
  42.     BNE.S   .CL
  43.     MOVE.L  (A0),(A1)       ; PREV.NEXT:=CUR.NEXT
  44.     MOVE.L  4(A0),D0
  45.     EXG.L   A0,A1
  46.     MOVE.L  4.W,A6
  47.     MOVEM.L D1/A0,-(A7)
  48.     JSR -210(A6)
  49.     MOVEM.L (A7)+,D1/A0
  50.     BRA.S   .XL
  51. .X: MOVEM.L (A7)+,D1/D2/D3/A0-A3/A6
  52.     RTS
  53. .SP:    MOVE.L  A0,D1
  54.     BRA.S   .SL
  55. .SP2:   MOVE.L  A2,D2
  56.     BRA.S   .SL2
  57.  
  58. SEARCHINCACHE:            ; RETURNS D0=MODPTR OR NIL
  59.     MOVEM.L D1/A0-A3,-(A7)
  60.     MOVE.L  PORTADR(PC),D0
  61.     BEQ.S   .X
  62.     MOVE.L  D0,A0
  63.     MOVE.L  38(A0),A0
  64.     MOVE.L  CACHENAMESTART(PC),A1
  65.     MOVE.L  CACHENAMEEND(PC),D1
  66.     SUB.L   A1,D1
  67. .XL:MOVE.L  A0,D0
  68.     BEQ.S   .X
  69.     CMP.L   12(A0),D1       ; SEE IF LENGTHS MATCH
  70.     BNE.S   .N
  71.     MOVE.L  8(A0),A2
  72.     MOVE.L  A1,A3
  73. .CL:    CMPM.B  (A2)+,(A3)+     ; STRCMP
  74.     BNE.S   .N
  75.     TST.B   -1(A2)
  76.     BNE.S   .CL
  77.     MOVE.L  16(A0),D0       ; EXIT WITH MODPTR
  78.     BRA.S   .X
  79. .N: MOVE.L  (A0),A0
  80.     BRA.S   .XL
  81. .X: MOVEM.L (A7)+,D1/A0-A3
  82.     RTS
  83.  
  84. NEWCACHE:
  85.     TST.L   PORTADR         ; DO WE CACHE?
  86.     BEQ NEW
  87.     MOVEM.L D1-D3/A0-A3/A6,-(A7)    ; SIZE-->D0-->ADDR
  88.     MOVE.L  CACHENAMESTART(PC),A2
  89.     MOVE.L  CACHENAMEEND(PC),D3
  90.     SUB.L   A2,D3
  91.     MOVE.L  D0,A3           ; TEMP
  92.     ADD.L   #50,D0
  93.     ADD.L   D3,D0
  94.     MOVE.L  D0,D2
  95.     MOVEQ   #0,D1
  96.     MOVE.L  4.W,A6
  97.     JSR -198(A6)
  98.     TST.L   D0
  99.     BEQ.S   .EXX
  100.     MOVE.L  A3,D1
  101.     MOVE.L  D0,A0
  102.     MOVE.L  PORTADR(PC),A3      ; LINK INTO LIST
  103.     MOVE.L  38(A3),(A0)
  104.     MOVE.L  A0,38(A3)
  105.     MOVE.L  D2,4(A0)        ; SET MEM-LEN
  106.     MOVE.L  D3,12(A0)
  107.     LEA 32(A0),A3
  108.     MOVE.L  A3,8(A0)        ; SET NAME
  109. .XL:MOVE.B  (A2)+,D2
  110.     CMP.B   #"A",D2         ; LOWERCASE'M
  111.     BMI.S   .C
  112.     CMP.B   #"Z"+1,D2
  113.     BPL.S   .C
  114.     ADD.B   #32,D2
  115. .C: MOVE.B  D2,(A3)+
  116.     BNE.S   .XL
  117.     MOVE.L  A3,D3
  118.     BTST    #0,D3
  119.     BEQ.S   .S
  120.     ADDQ.L  #1,A3
  121. .S: MOVE.L  A3,16(A0)
  122.     MOVE.L  D1,20(A0)
  123.     MOVE.L  A3,D0
  124. .EXX:   MOVEM.L (A7)+,D1-D3/A0-A3/A6
  125.     RTS
  126.  
  127. GETCACHE:
  128.     BTST    #1,CODEPREFS+1      ; IF OPT=-c THEN DON'T USE CACHE
  129.     BEQ.S   .1
  130.     RTS
  131. .1: MOVE.L  4.W,A6
  132.     JSR -$84(A6)        ; FORBID
  133.     LEA CACHENAME(PC),A1
  134.     JSR -390(A6)        ; FINDPORT
  135.     TST.L   D0
  136.     BNE.S   .FOUND
  137.     MOVEQ   #1,D1           ; get ourselves mem for port
  138.     SWAP    D1
  139.     MOVEQ   #100,D0
  140.     MOVE.L  4.W,A6
  141.     JSR -198(A6)
  142.     TST.L   D0
  143.     BEQ.S   .FAIL
  144.     MOVE.L  D0,A5           ; A5=MESSAGEPORT
  145.     LEA CACHENAME(PC),A0
  146.     LEA 50(A5),A1
  147.     MOVE.L  A1,D0
  148. .XL:MOVE.B  (A0)+,(A1)+
  149.     BNE.S   .XL
  150.     MOVE.L  D0,10(A5)
  151.     MOVE.B  #4,8(A5)        ; this is a msgport
  152.     MOVE.B  #1,9(A5)        ; pri = 1
  153.     MOVE.B  #2,14(A5)       ; pa_ignore
  154.     MOVE.L  #PORTCOOKIE,34(A5)
  155.     MOVE.L  A5,A1
  156.     JSR -354(A6)
  157.     BRA.S   .PORT
  158. .FOUND: MOVE.L  D0,A5
  159. .PORT:  MOVE.L  #DEBUGDATA,42(A5)
  160.     TST.W   46(A5)
  161.     BNE.S   .FAIL
  162.     CMP.L   #PORTCOOKIE,34(A5)  ; HERE WE HAVE VALID PORT IN A5
  163.     BNE.S   .FAIL
  164.     MOVE.L  A5,PORTADR
  165.     MOVE.W  #1,46(A5)
  166. .FAIL:  JSR -$8A(A6)        ; PERMIT
  167.     RTS
  168.  
  169. UNLOCKCACHE:
  170.     MOVE.L  4.W,A6
  171.     JSR -$84(A6)        ; FORBID
  172.     MOVE.L  PORTADR(PC),D0
  173.     BEQ.S   .1
  174.     MOVE.L  D0,A0
  175.     CLR.W   46(A0)
  176. .1: JSR -$8A(A6)        ; PERMIT
  177.     RTS
  178.  
  179. ;     RESCHECK:             ; PRESERVES ALL REGS IF OK
  180. ;   TST.W   .1
  181. ;   BNE.S   .X
  182. ;   MOVE.W  #-1,.1
  183. ;   RTS
  184. ;.1:    DC.W    0
  185. ;.X:    MOVE.L  INITSTACK,A7        ; EMERGENCY EXIT
  186. ;   MOVEQ   #20,D0
  187. ;   RTS
  188. ;*-*
  189.  
  190.